/*
 * sysmo 服务器等待加入监控列表的新客户端（节点）
 * Copyright (C) 2009  YuLicheng
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.sysmo.server.node;

import org.sysmo.communication.CommunicationInterface;

/**
 * 
 * 此类实例表示一个等待加入监控列表的客户端节点。当用户允许该节点加入监控
 * 列表时，此实例将会生成已连接节点，并且使用回调接口通知外部逻辑。
 *
 * @author YuLicheng
 */
public class NewNode extends Node {

    private CommunicationInterface client;

    /**
     * 当新客户端连接时，此类的实例被创建。
     *
     * @param stateListener
     * @param client
     */
    public NewNode(NodeStateChangeListener stateListener,
            CommunicationInterface client) {
        super(stateListener);
        this.client = client;
    }

    /**
     * 创建与新的客户端之间的连接，以保证客户端节点一直在等待加入被监控列表。
     * 当其被加入时，此方法即返回，而连接控制权会被转交给新的已连接节点实例。
     * 此方法将创建一个新线程执行等待连接操作，而旧线程会立即返回。
     */
    public void waitConnect() {
        
    }

    /**
     * 终止与新客户端的连接。一般只有当服务器需要关闭时才会调用此方法。
     * 此方法会发送服务器已关闭的消息给客户端并断开连接。导致
     * {@link #waitConnect}中的等待线程结束。
     */
    public void stopWaitConnect() {

    }

    /**
     * 将此节点加入被监控列表。
     *
     * 当用户选择将此节点加入被监控列表时，调用此方法。此方法会给客户端发送
     * 一个新的客户端ID，然后结束{@link #waitConnect()}中的等待线程，
     * 并生成此节点的{@link ConnectedNode}实例。最后调用节点状态回调接口的
     * {@link NodeStateChangeListener#nodeAdded(NewNode, ConnectedNode)}
     * 方法通知外部逻辑后返回。
     *
     * @param name 为客户端节点指定的别名。
     * @return 此客户端对应的已连接节点实例。
     * @see NodeStateChangeListener
     */
    public ConnectedNode addIn(String name) {
        return null;
    }
}
